package com.wang;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * DDL：
 * 1、创建命名空间
 * 2、判断表是否存在
 * 3、创建表
 * 4、删除表
 *
 * DML：
 * 5、插入数据
 * 6、查数据（get）
 * 7、查数据（scan）
 * 8、删除数据
 *
 */
public class TestAPI {

    private static Connection connection = null;
    private static Admin admin = null;

    static {
        try {
            // 1、获取配置文件信息
            Configuration configuration = HBaseConfiguration.create();
            configuration.set("hbase.zookeeper.quorum", "hadoop114,hadoop115,hadoop116");
            // 2、获取管理员对象
            connection = ConnectionFactory.createConnection(configuration);
            admin = connection.getAdmin();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    public static void close(){
        if(admin != null){
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(connection != null){
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 创建命名空间
     * @param ns
     */
    public static void createNameSpace(String ns){
        // 创建命名空间描述器
        NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(ns).build();
        // 创建命名空间
        try {
            admin.createNamespace(namespaceDescriptor);
        } catch (NamespaceExistException e) {
            System.out.println(ns + "命名空间已存在！");
        }catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("接下来可以创建表了！");
    }

    /**
     * 判断表是否存在
     * @param tableName
     * @return
     * @throws IOException
     */
    public static boolean isTableExist(String tableName) throws IOException {
//        // 1、获取配置文件信息
//        Configuration configuration = HBaseConfiguration.create();
//        configuration.set("hbase.zookeeper.quorum", "hadoop114,hadoop115,hadoop116");
//        // 2、获取管理员对象
//        Connection connection = ConnectionFactory.createConnection(configuration);
//        Admin admin = connection.getAdmin();
        // 3、判断表是否存在
        boolean tableExists = admin.tableExists(TableName.valueOf(tableName));
        // 4、关闭连接
//        admin.close();
        return tableExists;
    }

    /**
     * 创建表
     * @param tableName
     * @param cfs
     */
    public static void createTable(String tableName, String... cfs) throws IOException {
        // 判断是否存在列族信息
        if(cfs.length <= 0){
            System.out.println("请设置列族信息！");
            return;
        }
        // 判断表是否存在
        if(isTableExist(tableName)){
            System.out.println("表已存在！");
            return;
        }
        // 创建表描述器
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
        // 循环添加列族信息
        for (String cf : cfs) {
            // 创建列族描述器
            HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
            // 添加具体的列族信息
            hTableDescriptor.addFamily(hColumnDescriptor);
        }
        // 创建表
        admin.createTable(hTableDescriptor);
    }

    /**
     * 删除表
     * @param tableName
     * @throws IOException
     */
    public static void dropTable(String tableName) throws IOException {
        // 判断表是否存在
        if(!isTableExist(tableName)){
            System.out.println(tableName + "表不存在！");
            return;
        }
        // 使表下线
        admin.disableTable(TableName.valueOf(tableName));
        // 删除表
        admin.deleteTable(TableName.valueOf(tableName));
    }

    /**
     * 插入数据
     * @param tableName
     * @param rowKey
     * @param cf
     * @param cn
     * @param value
     * @throws IOException
     */
    public static void putData(String tableName, String rowKey, String cf, String cn, String value) throws IOException {
        // 获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        // 创建 put 对象
        Put put = new Put(Bytes.toBytes(rowKey));
        // 给 put 对象赋值
        put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
        // 插入数据
        table.put(put);
        // 关闭连接
        table.close();
    }

    /**
     * 查数据（get）
     * @param tableName
     * @param rowKey
     * @param cf
     * @param cn
     * @throws IOException
     */
    public static void getData(String tableName, String rowKey, String cf, String cn) throws IOException {
        // 获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        // 创建 get 对象
        Get get = new Get(Bytes.toBytes(rowKey));
        // 指定获取的列族
//        get.addFamily(Bytes.toBytes(cf));
        // 指定获取的列族和列
        get.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
        // 获取数据
        Result result = table.get(get);
        // 解析 result 并打印
        for (Cell cell : result.rawCells()) {
            System.out.println("RK:" + Bytes.toString(CellUtil.cloneRow(cell))
                    + ",CF:" + Bytes.toString(CellUtil.cloneFamily(cell))
                    + ",CN:" + Bytes.toString(CellUtil.cloneQualifier(cell))
                    + ",Value:" + Bytes.toString(CellUtil.cloneValue(cell)));
        }
        // 关闭连接
        table.close();

    }

    /**
     * 查数据（scan）
     * @param tableName
     * @throws IOException
     */
    public static void scanTable(String tableName) throws IOException {
        // 获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        // 构建scan对象
        Scan scan = new Scan(Bytes.toBytes("1001"));
        // 扫描表
        ResultScanner resultScanner = table.getScanner(scan);
        for (Result result : resultScanner) {
            for (Cell cell : result.rawCells()) {
                System.out.println("RK:" + Bytes.toString(CellUtil.cloneRow(cell))
                        + ",CF:" + Bytes.toString(CellUtil.cloneFamily(cell))
                        + ",CN:" + Bytes.toString(CellUtil.cloneQualifier(cell))
                        + ",Value:" + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
        table.close();
    }

    /**
     * 删除数据
     * @param tableName
     * @param rowKey
     * @param cf
     * @param cn
     * @throws IOException
     */
    public static void deleteData(String tableName, String rowKey, String cf, String cn) throws IOException {
        // 获取表对象
        Table table = connection.getTable(TableName.valueOf(tableName));
        Delete delete = new Delete(Bytes.toBytes(rowKey));
        table.delete(delete);
        table.close();
    }

    public static void main(String[] args) throws IOException {
        // 测试创建命名空间
//        createNameSpace("1990");
//        // 1、测试表是否存在
//        System.out.println(isTableExist("test2"));
////        // 2、测试创建表
//        createTable("1990:test2","info1", "info2");
//        // 3、测试删除表
//        dropTable("1990:test2");
//        System.out.println(isTableExist("test2"));
//        putData("test1", "1001", "info1", "name", "wang");
        // 测试查数据
//        getData("test1", "1001","info1", "name");
        // 测试查数据
//        scanTable("test1");
        // 测试删除数据
        deleteData("test1","1002","","");
        //   关闭连接
        close();
    }





}
